package com.binarysoft.service.common.snmp;

import java.io.Serializable;

public class SnmpObject implements Serializable {
	/**
	 * SNMP对象的名称
	 */
	private String name = null;
	/**
	 * Object ID
	 */
	private String oid = null;
	/**
	 * 这个字段只适用于标量对象,默认是SnmpService.DEFAULT_INDEX, 在对向量对象按照索引值subOID分解为标量对象时, oid
	 * 赋值为 oid + "." + subOID, 此时defaultIndex=subOID
	 */
	private String defaultIndexValue = SnmpService.DEFAULT_INDEX;

	/**
	 * 是否启用defaultIndexValue，默认情况下启用defaultIndexValue，即snmpget时，通过OID +
	 * defaultIndexValue； 当useDefaultIndex==false时，snmpget 直接通过OID获取数据
	 */
	private boolean useDefaultIndex = true;

	/**
	 * SNMP索引对象，索引对象需定义为不带索引的向量对象(类型2的对象),通过getNetxt方法取出索引对象的所有值,
	 * SNMP对象的值通过OID分别后接索引对象的所有的值，然后通过get()方法获取所有实例的值
	 * 其实SNMP对象可以具有多个索引对象,理论上可以先采集所有索引对象的值，然后把索引对象的值做笛卡尔积运算，
	 * 运算的结果分别后接到索引对象OID，再用get方法获取SNMP对象的值，但实际情况是，SNMP对象实例的索引值只是索引对象
	 * 的值的笛卡尔积运算结果集合的一个很小的子集,若采用get方法会存在大量的不存在的OID,导致采集错误，而影响正常的OID的采集,
	 * 所以这里只考虑具有单个索引的SNMP对象,对于具有多个索引的SNMP对象，则定义为不带索引的向量对象使用getNext进行采集
	 * 对于标量对象，是没有索引对象的，SNMP规定标量对象的索引值为0
	 */
	private SnmpObject indexObject = null;

	/**
	 * SNMP对象的类型 1-SINGLE_INSTANCE_OBJECT 2-MULTI_INSTANCE_OBJECT_WITHOUT_INDEX
	 * 3-MULTI_INSTANCE_OBJECT_WITH_INDEX
	 */
	private int objectType = SnmpService.MULTI_INSTANCE_OBJECT_WITHOUT_INDEX;
	/**
	 * SNMP对象的值的类型
	 */
	private int valueType = SnmpService.TYPE_STRING;
	private String charSet = SnmpService.CHARSET_GB2312;
	/**
	 * SNMP对象的描述
	 */
	private String description = null;

	/**
	 * 分解向量对象为标量对象时，根据索引值生成新的标量对象
	 * 
	 * @param indexValue
	 *            the value of index
	 * @param newObjectType
	 *            object type for the new object
	 * @return new object
	 */
	protected SnmpObject clone(String indexValue, int newObjectType) {
		SnmpObject newObject = new SnmpObject();
		newObject.setName(name);
		newObject.setDescription(description);
		newObject.setOid(oid);
		newObject.setDefaultIndexValue(indexValue);
		newObject.setUseDefaultIndex(this.useDefaultIndex);
		newObject.setObjectType(newObjectType);
		newObject.setValueType(valueType);
		newObject.setCharSet(charSet);
		return newObject;
	}

	public boolean isUseDefaultIndex() {
		return useDefaultIndex;
	}

	public void setUseDefaultIndex(boolean useDefaultIndex) {
		this.useDefaultIndex = useDefaultIndex;
	}

	public String getDefaultIndexValue() {
		return defaultIndexValue;
	}

	public void setDefaultIndexValue(String defaultIndexValue) {
		this.defaultIndexValue = defaultIndexValue;
	}

	public SnmpObject getIndexObject() {
		return indexObject;
	}

	public void setIndexObject(SnmpObject indexObject) {
		this.indexObject = indexObject;
	}

	public String getCharSet() {
		return charSet;
	}

	public void setCharSet(String charSet) {
		this.charSet = charSet;
	}

	public int getObjectType() {
		return objectType;
	}

	public void setObjectType(int objectType) {
		this.objectType = objectType;
	}

	public String getOid() {
		return oid;
	}

	public void setOid(String oid) {
		this.oid = oid;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public int getValueType() {
		return valueType;
	}

	public void setValueType(int valueType) {
		this.valueType = valueType;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof SnmpObject) {
			SnmpObject so = (SnmpObject) obj;
			return so.keyString().equals(this.keyString());
		}
		return false;
	}

	@Override
	public int hashCode() {
		return keyString().hashCode();
	}

	private String keyString() {
		StringBuffer sb = new StringBuffer();
		sb.append(oid).append(".").append(defaultIndexValue);
		return sb.toString();
	}

	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("name[").append(name).append("]");
		sb.append("OID[").append(oid).append("]");
		sb.append("Index[").append(defaultIndexValue).append("]");
		sb.append("objectType[").append(objectType).append("]");
		sb.append("valueType[").append(valueType).append("]");
		return sb.toString();
	}
}